
#include "DibLib.h"

/*
 *  M D S P    Generic function
 * -----------------------
 *  0 0 0 0    -> BLACKNESS, WHITENESS
 *  0 0 0 1    -> PATCOPY, NOTPATCOPY
 *  0 0 1 0    -> SRCCOPY, NOTSRCCOPY
 *  0 0 1 1    SrcPatBlt
 *  0 1 0 0    -> NOOP, DESTINVERT
 *  0 1 0 1    PatPaint
 *  0 1 1 0    SrcPaint
 *  0 1 1 1    BitBlt
 *  1 0 0 0    MaskCopy, -> SRCCOPY / SRCINVERT using Mask als source
 *  1 0 0 1    MaskPatBlt
 *  1 0 1 0    MaskSrcBlt
 *  1 0 1 1    MaskSrcPatBlt
 *  1 1 0 0    MaskPaint
 *  1 1 0 1    MaskPatPaint
 *  1 1 1 0    MaskSrcPaint
 *  1 1 1 1    MaskBlt
 */


const BYTE ajShift4[2] = {4, 0};

enum
{
    INDEX_BitBlt_NOOP,
    INDEX_BitBlt_DSTINVERT,
    INDEX_BitBlt_BLACKNESS,
    INDEX_BitBlt_WHITENESS,
    INDEX_BitBlt_PATCOPY,
    INDEX_BitBlt_NOTPATCOPY,
    INDEX_BitBlt_SRCCOPY,
    INDEX_BitBlt_NOTSRCCOPY,
    INDEX_BitBlt_SRCERASE,
    INDEX_BitBlt_NOTSRCERASE,
    INDEX_BitBlt_PATINVERT,
    INDEX_BitBlt_SRCINVERT,
    INDEX_BitBlt_SRCAND,
    INDEX_BitBlt_MERGEPAINT,
    INDEX_BitBlt_MERGECOPY,
    INDEX_BitBlt_SRCPAINT,
    INDEX_BitBlt_PATPAINT,
    INDEX_SrcPatBlt,
    INDEX_PatPaint,
    INDEX_SrcPaint,
    INDEX_BitBlt,
};

const PFN_DIBFUNCTION
gapfnDibFunction[] =
{
    Dib_BitBlt_NOOP,
    Dib_BitBlt_DSTINVERT,
    Dib_BitBlt_BLACKNESS,
    Dib_BitBlt_WHITENESS,
    Dib_BitBlt_PATCOPY,
    Dib_BitBlt_NOTPATCOPY,
    Dib_BitBlt_SRCCOPY,
    Dib_BitBlt_NOTSRCCOPY,
    Dib_BitBlt_SRCERASE,
    Dib_BitBlt_NOTSRCERASE,
    Dib_BitBlt_PATINVERT,
    Dib_BitBlt_SRCINVERT,
    Dib_BitBlt_SRCAND,
    Dib_BitBlt_MERGEPAINT,
    Dib_BitBlt_MERGECOPY,
    Dib_BitBlt_SRCPAINT,
    Dib_BitBlt_PATPAINT,
    Dib_SrcPatBlt,
    Dib_PatPaint,
    Dib_SrcPaint,
    Dib_BitBlt,
};

const UCHAR
gajIndexPerRop[256] =
{
    INDEX_BitBlt_BLACKNESS, // BLACKNESS
    INDEX_BitBlt, // DPSoon,
    INDEX_BitBlt, // DPSona,
    INDEX_SrcPatBlt, // PSon,
    INDEX_BitBlt, // SDPona,
    INDEX_PatPaint, // DPon,
    INDEX_BitBlt, // PDSxnon,
    INDEX_BitBlt, // PDSaon,
    INDEX_BitBlt, // SDPnaa,
    INDEX_BitBlt, // PDSxon,
    INDEX_PatPaint, // DPna,
    INDEX_BitBlt, // PSDnaon,
    INDEX_SrcPatBlt, // SPna,
    INDEX_BitBlt, // PDSnaon,
    INDEX_BitBlt, // PDSonon,
    INDEX_BitBlt_NOTPATCOPY, // Pn,
    INDEX_BitBlt, // PDSona,
    INDEX_BitBlt_NOTSRCERASE, // DSon / NOTSRCERASE
    INDEX_BitBlt, // SDPxnon,
    INDEX_BitBlt, // SDPaon,
    INDEX_BitBlt, // DPSxnon,
    INDEX_BitBlt, // DPSaon,
    INDEX_BitBlt, // PSDPSanaxx,
    INDEX_BitBlt, // SSPxDSxaxn,
    INDEX_BitBlt, // SPxPDxa,
    INDEX_BitBlt, // SDPSanaxn,
    INDEX_BitBlt, // PDSPaox,
    INDEX_BitBlt, // SDPSxaxn,
    INDEX_BitBlt, // PSDPaox,
    INDEX_BitBlt, // DSPDxaxn,
    INDEX_BitBlt, // PDSox,
    INDEX_BitBlt, // PDSoan,
    INDEX_BitBlt, // DPSnaa,
    INDEX_BitBlt, // SDPxon,
    INDEX_SrcPaint, // DSna,
    INDEX_BitBlt, // SPDnaon,
    INDEX_BitBlt, // SPxDSxa,
    INDEX_BitBlt, // PDSPanaxn,
    INDEX_BitBlt, // SDPSaox,
    INDEX_BitBlt, // SDPSxnox,
    INDEX_BitBlt, // DPSxa,
    INDEX_BitBlt, // PSDPSaoxxn,
    INDEX_BitBlt, // DPSana,
    INDEX_BitBlt, // SSPxPDxaxn,
    INDEX_BitBlt, // SPDSoax,
    INDEX_BitBlt, // PSDnox,
    INDEX_BitBlt, // PSDPxox,
    INDEX_BitBlt, // PSDnoan,
    INDEX_SrcPatBlt, // PSna,
    INDEX_BitBlt, // SDPnaon,
    INDEX_BitBlt, // SDPSoox,
    INDEX_BitBlt_NOTSRCCOPY, // Sn / NOTSRCCOPY
    INDEX_BitBlt, // SPDSaox,
    INDEX_BitBlt, // SPDSxnox,
    INDEX_BitBlt, // SDPox,
    INDEX_BitBlt, // SDPoan,
    INDEX_BitBlt, // PSDPoax,
    INDEX_BitBlt, // SPDnox,
    INDEX_BitBlt, // SPDSxox,
    INDEX_BitBlt, // SPDnoan,
    INDEX_SrcPatBlt, // PSx,
    INDEX_BitBlt, // SPDSonox,
    INDEX_BitBlt, // SPDSnaox,
    INDEX_SrcPatBlt, // PSan,
    INDEX_BitBlt, // PSDnaa,
    INDEX_BitBlt, // DPSxon,
    INDEX_BitBlt, // SDxPDxa,
    INDEX_BitBlt, // SPDSanaxn,
    INDEX_BitBlt_SRCERASE, // SDna / SRCERASE
    INDEX_BitBlt, // DPSnaon,
    INDEX_BitBlt, // DSPDaox,
    INDEX_BitBlt, // PSDPxaxn,
    INDEX_BitBlt, // SDPxa,
    INDEX_BitBlt, // PDSPDaoxxn,
    INDEX_BitBlt, // DPSDoax,
    INDEX_BitBlt, // PDSnox,
    INDEX_BitBlt, // SDPana,
    INDEX_BitBlt, // SSPxDSxoxn,
    INDEX_BitBlt, // PDSPxox,
    INDEX_BitBlt, // PDSnoan,
    INDEX_PatPaint, // PDna,
    INDEX_BitBlt, // DSPnaon,
    INDEX_BitBlt, // DPSDaox,
    INDEX_BitBlt, // SPDSxaxn,
    INDEX_BitBlt, // DPSonon,
    INDEX_BitBlt_DSTINVERT, // Dn / DSTINVERT
    INDEX_BitBlt, // DPSox,
    INDEX_BitBlt, // DPSoan,
    INDEX_BitBlt, // PDSPoax,
    INDEX_BitBlt, // DPSnox,
    INDEX_BitBlt_PATINVERT, // DPx / PATINVERT
    INDEX_BitBlt, // DPSDonox,
    INDEX_BitBlt, // DPSDxox,
    INDEX_BitBlt, // DPSnoan,
    INDEX_BitBlt, // DPSDnaox,
    INDEX_PatPaint, // DPan,
    INDEX_BitBlt, // PDSxa,
    INDEX_BitBlt, // DSPDSaoxxn,
    INDEX_BitBlt, // DSPDoax,
    INDEX_BitBlt, // SDPnox,
    INDEX_BitBlt, // SDPSoax,
    INDEX_BitBlt, // DSPnox,
    INDEX_BitBlt_SRCINVERT, // DSx / SRCINVERT
    INDEX_BitBlt, // SDPSonox,
    INDEX_BitBlt, // DSPDSonoxxn,
    INDEX_BitBlt, // PDSxxn,
    INDEX_BitBlt, // DPSax,
    INDEX_BitBlt, // PSDPSoaxxn,
    INDEX_BitBlt, // SDPax,
    INDEX_BitBlt, // PDSPDoaxxn,
    INDEX_BitBlt, // SDPSnoax,
    INDEX_BitBlt, // PDSxnan,
    INDEX_BitBlt, // PDSana,
    INDEX_BitBlt, // SSDxPDxaxn,
    INDEX_BitBlt, // SDPSxox,
    INDEX_BitBlt, // SDPnoan,
    INDEX_BitBlt, // DSPDxox,
    INDEX_BitBlt, // DSPnoan,
    INDEX_BitBlt, // SDPSnaox,
    INDEX_SrcPaint, // DSan,
    INDEX_BitBlt, // PDSax,
    INDEX_BitBlt, // DSPDSoaxxn,
    INDEX_BitBlt, // DPSDnoax,
    INDEX_BitBlt, // SDPxnan,
    INDEX_BitBlt, // SPDSnoax,
    INDEX_BitBlt, // DPSxnan,
    INDEX_BitBlt, // SPxDSxo,
    INDEX_BitBlt, // DPSaan,
    INDEX_BitBlt, // DPSaa,
    INDEX_BitBlt, // SPxDSxon,
    INDEX_BitBlt, // DPSxna,
    INDEX_BitBlt, // SPDSnoaxn,
    INDEX_BitBlt, // SDPxna,
    INDEX_BitBlt, // PDSPnoaxn,
    INDEX_BitBlt, // DSPDSoaxx,
    INDEX_BitBlt, // PDSaxn,
    INDEX_BitBlt_SRCAND, // DSa / SRCAND
    INDEX_BitBlt, // SDPSnaoxn,
    INDEX_BitBlt, // DSPnoa,
    INDEX_BitBlt, // DSPDxoxn,
    INDEX_BitBlt, // SDPnoa,
    INDEX_BitBlt, // SDPSxoxn,
    INDEX_BitBlt, // SSDxPDxax,
    INDEX_BitBlt, // PDSanan,
    INDEX_BitBlt, // PDSxna,
    INDEX_BitBlt, // SDPSnoaxn,
    INDEX_BitBlt, // DPSDPoaxx,
    INDEX_BitBlt, // SPDaxn,
    INDEX_BitBlt, // PSDPSoaxx,
    INDEX_BitBlt, // DPSaxn,
    INDEX_BitBlt, // DPSxx,
    INDEX_BitBlt, // PSDPSonoxx,
    INDEX_BitBlt, // SDPSonoxn,
    INDEX_SrcPaint, // DSxn,
    INDEX_BitBlt, // DPSnax,
    INDEX_BitBlt, // SDPSoaxn,
    INDEX_BitBlt, // SPDnax,
    INDEX_BitBlt, // DSPDoaxn,
    INDEX_BitBlt, // DSPDSaoxx,
    INDEX_BitBlt, // PDSxan,
    INDEX_PatPaint, // DPa,
    INDEX_BitBlt, // PDSPnaoxn,
    INDEX_BitBlt, // DPSnoa,
    INDEX_BitBlt, // DPSDxoxn,
    INDEX_BitBlt, // PDSPonoxn,
    INDEX_PatPaint, // PDxn,
    INDEX_BitBlt, // DSPnax,
    INDEX_BitBlt, // PDSPoaxn,
    INDEX_BitBlt, // DPSoa,
    INDEX_BitBlt, // DPSoxn,
    INDEX_BitBlt_NOOP, // D,
    INDEX_BitBlt, // DPSono,
    INDEX_BitBlt, // SPDSxax,
    INDEX_BitBlt, // DPSDaoxn,
    INDEX_BitBlt, // DSPnao,
    INDEX_PatPaint, // DPno,
    INDEX_BitBlt, // PDSnoa,
    INDEX_BitBlt, // PDSPxoxn,
    INDEX_BitBlt, // SSPxDSxox,
    INDEX_BitBlt, // SDPanan,
    INDEX_BitBlt, // PSDnax,
    INDEX_BitBlt, // DPSDoaxn,
    INDEX_BitBlt, // DPSDPaoxx,
    INDEX_BitBlt, // SDPxan,
    INDEX_BitBlt, // PSDPxax,
    INDEX_BitBlt, // DSPDaoxn,
    INDEX_BitBlt, // DPSnao,
    INDEX_BitBlt_MERGEPAINT, // DSno / MERGEPAINT
    INDEX_BitBlt, // SPDSanax,
    INDEX_BitBlt, // SDxPDxan,
    INDEX_BitBlt, // DPSxo,
    INDEX_BitBlt, // DPSano,
    INDEX_BitBlt_MERGECOPY, // PSa / MERGECOPY
    INDEX_BitBlt, // SPDSnaoxn,
    INDEX_BitBlt, // SPDSonoxn,
    INDEX_SrcPatBlt, // PSxn,
    INDEX_BitBlt, // SPDnoa,
    INDEX_BitBlt, // SPDSxoxn,
    INDEX_BitBlt, // SDPnax,
    INDEX_BitBlt, // PSDPoaxn,
    INDEX_BitBlt, // SDPoa,
    INDEX_BitBlt, // SPDoxn,
    INDEX_BitBlt, // DPSDxax,
    INDEX_BitBlt, // SPDSaoxn,
    INDEX_BitBlt_SRCCOPY, // S / SRCCOPY
    INDEX_BitBlt, // SDPono,
    INDEX_BitBlt, // SDPnao,
    INDEX_SrcPatBlt, // SPno,
    INDEX_BitBlt, // PSDnoa,
    INDEX_BitBlt, // PSDPxoxn,
    INDEX_BitBlt, // PDSnax,
    INDEX_BitBlt, // SPDSoaxn,
    INDEX_BitBlt, // SSPxPDxax,
    INDEX_BitBlt, // DPSanan,
    INDEX_BitBlt, // PSDPSaoxx,
    INDEX_BitBlt, // DPSxan,
    INDEX_BitBlt, // PDSPxax,
    INDEX_BitBlt, // SDPSaoxn,
    INDEX_BitBlt, // DPSDanax,
    INDEX_BitBlt, // SPxDSxan,
    INDEX_BitBlt, // SPDnao,
    INDEX_SrcPaint, // SDno,
    INDEX_BitBlt, // SDPxo,
    INDEX_BitBlt, // SDPano,
    INDEX_BitBlt, // PDSoa,
    INDEX_BitBlt, // PDSoxn,
    INDEX_BitBlt, // DSPDxax,
    INDEX_BitBlt, // PSDPaoxn,
    INDEX_BitBlt, // SDPSxax,
    INDEX_BitBlt, // PDSPaoxn,
    INDEX_BitBlt, // SDPSanax,
    INDEX_BitBlt, // SPxPDxan,
    INDEX_BitBlt, // SSPxDSxax,
    INDEX_BitBlt, // DSPDSanaxxn,
    INDEX_BitBlt, // DPSao,
    INDEX_BitBlt, // DPSxno,
    INDEX_BitBlt, // SDPao,
    INDEX_BitBlt, // SDPxno,
    INDEX_BitBlt_SRCPAINT, // DSo / SRCPAINT
    INDEX_BitBlt, // SDPnoo,
    INDEX_BitBlt_PATCOPY, // P / PATCOPY
    INDEX_BitBlt, // PDSono,
    INDEX_BitBlt, // PDSnao,
    INDEX_SrcPatBlt, // PSno,
    INDEX_BitBlt, // PSDnao,
    INDEX_PatPaint, // PDno,
    INDEX_BitBlt, // PDSxo,
    INDEX_BitBlt, // PDSano,
    INDEX_BitBlt, // PDSao,
    INDEX_BitBlt, // PDSxno,
    INDEX_PatPaint, // DPo,
    INDEX_BitBlt_PATPAINT, // DPSnoo, // PATPAINT
    INDEX_SrcPatBlt, // PSo,
    INDEX_BitBlt, // PSDnoo,
    INDEX_BitBlt, // DPSoo,
    INDEX_BitBlt_WHITENESS //WHITENESS
};

const PFN_DIBFUNCTION
gapfnMaskFunction[8] =
{
    Dib_MaskCopy,
    Dib_MaskPatBlt,
    Dib_MaskSrcBlt,
    Dib_MaskSrcPatBlt,
    Dib_MaskPaint,
    Dib_MaskPatPaint,
    Dib_MaskSrcPaint,
    Dib_MaskBlt
};
